﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main1()
{
	// 文件内容拷贝
	FILE* pread = fopen("data1.txt", "r");		// 以读的方式打开
	if (pread == NULL)
	{
		perror("fopen-1\n");
		return 1;
	}
	FILE* pwrite = fopen("data2.txt", "w");		// 以写的方式打开
	if (pwrite == NULL)
	{
		perror("fopen-2\n");
		fclose(pread);
		pread = NULL;
		return 1;
	}
	int ch = 0;
	while ((ch = fgetc(pread)) != EOF)           // 功能：一次读一个字符   参数：文件类型指针   返回值：int
	{
		fputc(ch, pwrite);                      // 功能;一次写一个字符    参数：要写的内容；写在哪个空间
	}
	fclose(pread);
	pread = NULL;
	fclose(pwrite);
	pwrite = NULL;
	return 0;
}
int main2()
{
	FILE* p = fopen("data1.txt", "r");   // 以读的方式打开
	//int c = fputc('a', p);  // 功能：一次写一个字符，适用所有的输出流  参数：要写的内容；文件类型的指针    返回的是对应的ASCII值，读取失败返回NULL
	//printf("%d", c);
	int c = fgetc(p);   //功能：一次读一个字符；适用所有的输入流；有多个字符，那么将会读取上一次被读取字符的下一个字符   参数：文件类型指针  
	
	printf("%c\n", c); // a
	c = fgetc(p);
	printf("%c\n", c);  // b
	printf("%c\n", c);
	c = fgetc(p);   // c
	return 0;
}
struct s
{
	int age;
	float f;
	char arr[20];
};
int main3()
{
	FILE* p = fopen("data1.txt", "r");  
	if (p == NULL)
	{
		perror("fopen\n");
	}
	char arr[20] = "xxxxxxxxxxxxxxx";
	fgets(arr, 20, p);  // 实际在读的时候最多读19个字符，会在末尾自动再补上一个 \0（字符串结束标志是\0）     功能;每次在调用时 ，只读取一行的内容
	printf("%s\n", arr);
	return 0;
}

int main4()
{
	//  格式化(取决于数据的类型)的输入输出函数
	/*struct s s = {14,3.14f,"lisi"};
	fprintf(stdout, "%d %f %s\n",s.age,s.f,s.arr);  // 指定格式打印到屏幕上
	FILE* p = fopen("data1.txt", "w");  //以写的方式打开
	if (p == NULL)
	{
		perror("fopen\n");
	}
	fprintf(p, "%d %f %s\n", s.age, s.f, s.arr);  // 指定格式打印到文件中
	*/
	FILE* p = fopen("data1.txt", "r");  //以读的方式打开---》fscanf
	if (p == NULL)
	{
		perror("fopen\n");
	}
	struct s s = { 14,3.14f,"lisi"};
	fscanf(p, "%d %f %s", &(s.age),&(s.f),s.arr);  // 按某种格式(取决于数据的类型)进行读取
	printf("%d %f %s\n", s.age, s.f, s.arr);     // 打印所读取的内容
	fclose(p);
	p = NULL;
	return 0;
}

int main5()
{
	// 格式化的数据与对应的字符串之间的相互转化
	struct s s = { 14,3.14f,"lisi" };
	char arr[30] = { 0 };
	sprintf(arr, "%d %f %s\n", s.age, s.f, s.arr);  // 把格式化的数据转换成字符串
	sscanf(arr, "%d %f %s", &(s.age), &(s.f), s.arr);  // 把字符串转换从格式化的内容
	printf("%d %f %s\n", s.age, s.f, s.arr);     // 打印格式化的内容

	return 0;
}
int main6()
{
	FILE* p = fopen("data1.txt", "w");
	fputs("abcfjjjj", p);
	fseek(p, 3, SEEK_SET);//功能：根据文件的指针和偏移量来定位指针位置  参数 ：指针；偏移量；偏移量的起始位置，他有3中情况 ：SEEK_SET  SEEK_COU SEEK_END
	fputs("de", p);   // 从指针定位的下一个字符开始把de 写到文件中
	fclose(p);
	p = NULL;
	return 0;
}
int main7()
{
	//fetell() 返回文件相对于起始位置的偏移量   注意：每读一次，指针就移动一次
	// long int ftell(FILE* stream)
	FILE* p = fopen("data1.txt", "w");
	fputs("abcd", p);
	fgetc(p);
	int size = ftell(p);
	printf("%d\n", size);
	return 0;
}
int main8()
{
	FILE* p = fopen("data1.txt", "w");  //以写的方式打开
	int ch = fputc('a', p);
	printf("%c", ch);
	fclose(p);
	p = NULL;
	return 0;
}
int main9()
{
		int n;
		FILE* pFile;
		char buffer[27];

		pFile = fopen("myfile.txt", "w+");  //“w+”为了读和写建立一个新文件，当指定文件不存在的时候会建立一个新文件
		for (n = 'A'; n <= 'Z'; n++)
			fputc(n, pFile);
		rewind(pFile);
		fread(buffer, 1, 26, pFile);  // fread() 二进制输入，只适用于对文件的输入   把26个字符输入到文件中
		fclose(pFile);
		buffer[26] = '\0';  //避免下面数组的越界访问
		puts(buffer);
	return 0;
}
//VS2019 WIN11环境测试
int main()
{
	FILE* pf = fopen("test.txt", "w");
	fputs("abcdef", pf);//先将代码放在输出缓冲区
	printf("睡眠10秒-已经写数据了，打开test.txt⽂件，发现⽂件没有内容\n");
	Sleep(10000);
	printf("刷新缓冲区\n");
	fflush(pf);//刷新缓冲区时，才将输出缓冲区的数据写到⽂件（磁盘）
	//注：fflush 在⾼版本的VS上不能使⽤了
	printf("再睡眠10秒-此时，再次打开test.txt⽂件，⽂件有内容了\n");
	Sleep(10000);
	fclose(pf);
	//注：fclose在关闭⽂件的时候，也会刷新缓冲区
	pf = NULL;
	return 0;
}